/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.ces4.produccion.client.solicitudproduccion;

import co.com.ces4.client.baseView.QueryBase;
import co.com.ces4.produccion.client.SolicitudProduccionService;
import co.com.ces4.produccion.client.SolicitudProduccionServiceAsync;
import co.com.ces4.produccion.client.solicitudproduccion.data.SolicitudProduccionDS;
import co.com.ces4.produccion.client.solicitudproduccion.data.SolicitudProduccionRecord;
import co.com.ces4.produccion.client.utils.Loader;
import co.com.ces4.produccion.jpa.entities.SolicitudProduccion;
import co.com.ces4.produccion.jpa.entities.Usuario;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.data.SortSpecifier;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.DateDisplayFormat;
import com.smartgwt.client.types.SelectionAppearance;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.types.SortDirection;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.Dialog;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.ButtonItem;
import com.smartgwt.client.widgets.form.fields.DateItem;
import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.grid.events.RecordDoubleClickEvent;
import com.smartgwt.client.widgets.grid.events.RecordDoubleClickHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.Layout;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 *
 * @author Sebastian
 */
public class ConsultarSolicitudProduccion extends QueryBase {

    private DynamicForm frmFiltrosBusqueda;
    private HLayout hlyAccionesConsulta;
    private DateItem dtpFechaInicio, dtpFechaFin;
    private ButtonItem btnConsultar, btnLimpiar;
    private Button btnNuevo, btnCancelar;
    private ListGrid resultsGrid;

    public ConsultarSolicitudProduccion() {
        super("Consulta de Solicitudes de Producción", "Parámetros de búsqueda", "Resultados", "100%");
        frmFiltrosBusqueda = new DynamicForm();
        frmFiltrosBusqueda.setCellPadding(10);
        frmFiltrosBusqueda.setWidth100();
        frmFiltrosBusqueda.setHeight("15px");
        frmFiltrosBusqueda.setNumCols(4);

        dtpFechaInicio = new DateItem("dtpFechaInicio", "Fecha de Inicio");
        dtpFechaInicio.setUseTextField(true);
        dtpFechaInicio.setRequired(true);
        dtpFechaInicio.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATE);
        dtpFechaFin = new DateItem("dtpFechaFin", "Fecha de Fin");
        dtpFechaFin.setUseTextField(true);
        dtpFechaFin.setRequired(true);
        dtpFechaFin.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATE);

        btnConsultar = new ButtonItem("btnConsultar", "Consultar");
        btnConsultar.setColSpan(2);
        btnConsultar.setStartRow(true);
        btnConsultar.setEndRow(false);
        btnConsultar.setAlign(Alignment.RIGHT);
        btnConsultar.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                solicitudesList();
            }
        });

        btnLimpiar = new ButtonItem("btnLimpiar", "Limpiar");
        btnLimpiar.setColSpan(2);
        btnLimpiar.setStartRow(false);
        btnLimpiar.setEndRow(true);
        btnLimpiar.setAlign(Alignment.LEFT);
        btnLimpiar.setTop(10);
        btnLimpiar.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                frmFiltrosBusqueda.clearValues();
                clearResults();
            }
        });

        btnNuevo = new Button("Nueva");
        btnNuevo.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {

            @Override
            public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {
                getSolicitudProduccionService().getUserSession(new AsyncCallback<Usuario>() {

                    public void onFailure(Throwable caught) {
                        SC.warn("Error", caught.getMessage(), new BooleanCallback() {

                            @Override
                            public void execute(Boolean value) {
                            }
                        }, new Dialog());
                    }

                    public void onSuccess(Usuario usuario) {
                        if (usuario != null) {
                            final EdicionSolicitudProduccion esp = new EdicionSolicitudProduccion(usuario);
                            ConsultarSolicitudProduccion.this.hide();
                            esp.setLayoutData("Nueva Solicitud de Producción");
                            ((Layout) ConsultarSolicitudProduccion.this.getParentElement()).addMember(esp);
                        } else {
                            SC.warn("Error", "Señor usuario, ocurrió un error inesperado en el sistema, por favor intente más tarde", new BooleanCallback() {

                                @Override
                                public void execute(Boolean value) {
                                }
                            }, new Dialog());
                            return;
                        }
                    }
                });
            }
        });

        btnCancelar = new Button("Cancelar");
        btnCancelar.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {

            public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {
                ListGridRecord[] selectedSolicitudes = resultsGrid.getSelection();
                final List<SolicitudProduccion> solicitudes = new ArrayList<SolicitudProduccion>();
                for (ListGridRecord solicitudRecord : selectedSolicitudes) {
                    solicitudes.add((SolicitudProduccion) solicitudRecord.getAttributeAsObject("solicitudProduccion"));
                }
                if (solicitudes.isEmpty()) {
                    SC.warn("Advertencia", "Señor usuario, debe seleccionar al menos una solicitudes de producción para realizar la cancelación", new BooleanCallback() {

                        @Override
                        public void execute(Boolean value) {
                        }
                    }, new Dialog());
                    return;
                }
                SC.confirm("Confirmar Desactivación", "¿Señor usuario, está seguro que desea cancelar las solicitudes de producción seleccionadas?", new BooleanCallback() {

                    public void execute(Boolean value) {
                        if (value) {
                            Loader.showLoader();
                            getSolicitudProduccionService().cancelarSolicitudesProduccion(solicitudes, new AsyncCallback<Void>() {

                                @Override
                                public void onFailure(Throwable caught) {
                                    SC.warn("Error", caught.getMessage(), new BooleanCallback() {

                                        @Override
                                        public void execute(Boolean value) {
                                        }
                                    }, new Dialog());
                                    Loader.hideLoader();
                                }

                                @Override
                                public void onSuccess(Void result) {
                                    SC.say("Señor usuario, la(las) solicitudes de producción seleccionada(s) fueron desactivadas correctamente");
                                    solicitudesList();
                                }
                            });
                        }
                    }
                });
            }
        });

        frmFiltrosBusqueda.setMargin(15);
        frmFiltrosBusqueda.setItems(dtpFechaInicio, dtpFechaFin, btnConsultar, btnLimpiar);

        hlyAccionesConsulta = new HLayout();
        hlyAccionesConsulta.setWidth100();
        hlyAccionesConsulta.setAlign(Alignment.LEFT);
        hlyAccionesConsulta.setMargin(5);
        hlyAccionesConsulta.addMember(btnNuevo);
        hlyAccionesConsulta.addMember(btnCancelar);
        hlyAccionesConsulta.setMembersMargin(15);

        resultsGrid = new ListGrid() {

            @Override
            protected String getBaseStyle(ListGridRecord record, int rowNum, int colNum) {
                if (getFieldName(colNum).equals("estadoSolicitud")) {
                    if (record.getAttribute("estadoSolicitud").equals("Activa")) {
                        return "estadoActivo";
                    } else {
                        return "estadoInactivo";
                    }
                } else {
                    return super.getBaseStyle(record, rowNum, colNum);
                }
            }
        };
        resultsGrid.setWidth100();
        resultsGrid.setHeight100();
        resultsGrid.setDataSource(new SolicitudProduccionDS());
        resultsGrid.setAutoFetchData(true);
        resultsGrid.setFields(SolicitudProduccionRecord.getFields());
        resultsGrid.setEmptyMessage("No hay registros para mostrar");
        resultsGrid.setSelectionType(SelectionStyle.SIMPLE);
        resultsGrid.setSelectionAppearance(SelectionAppearance.CHECKBOX);
        resultsGrid.setFilterOnKeypress(true);
        resultsGrid.setShowFilterEditor(true);
        resultsGrid.getField(SolicitudProduccionDS.CARGARSOLIPRO).setCanHide(false);
        resultsGrid.getField(SolicitudProduccionDS.CARGARSOLIPRO).setHidden(true);
        resultsGrid.getField(SolicitudProduccionDS.CARGARSOLIPRO).setCanFilter(false);
        resultsGrid.getField(SolicitudProduccionDS.FECHASOLICITUD).setWidth(140);
        SortSpecifier[] specifiers = new SortSpecifier[]{new SortSpecifier(SolicitudProduccionDS.FECHASOLICITUD, SortDirection.DESCENDING)};
        resultsGrid.setSort(specifiers);
        resultsGrid.addRecordDoubleClickHandler(new RecordDoubleClickHandler() {

            @Override
            public void onRecordDoubleClick(RecordDoubleClickEvent event) {
                Record solicitudRecord = event.getRecord();
                SolicitudProduccion solicitudProduccion = (SolicitudProduccion) solicitudRecord.getAttributeAsObject("solicitudProduccion");
                EdicionSolicitudProduccion esp = new EdicionSolicitudProduccion(solicitudProduccion);
                esp.setLayoutData("Vista de la Solictud de Producción");
                ConsultarSolicitudProduccion.this.hide();
                ((Layout) ConsultarSolicitudProduccion.this.getParentElement()).addMember(esp);
            }
        });

        addSectionContainerItem(hlyAccionesConsulta);
        setFilterSectionItems(frmFiltrosBusqueda);
        addResultsSectionItem(resultsGrid);
    }

    private void solicitudesList() {
        if (frmFiltrosBusqueda.validate()) {
            Date fechaInicio = dtpFechaInicio.getValueAsDate();
            Date fechaFin = dtpFechaFin.getValueAsDate();
            if (dtpFechaInicio.getValueAsDate().before(dtpFechaFin.getValueAsDate()) || dtpFechaInicio.getValueAsDate().getDate() == dtpFechaFin.getValueAsDate().getDate()) {
                Loader.showLoader();
                final AsyncCallback<List<SolicitudProduccion>> queryCallback = new AsyncCallback<List<SolicitudProduccion>>() {

                    @Override
                    public void onFailure(Throwable caught) {
                        SC.warn("Error", caught.getMessage(), new BooleanCallback() {

                            @Override
                            public void execute(Boolean value) {
                            }
                        }, new Dialog());
                        Loader.hideLoader();
                    }

                    @Override
                    public void onSuccess(List<SolicitudProduccion> result) {
                        clearResults();
                        for (int i = 0; i < result.size(); i++) {
                            resultsGrid.addData(new SolicitudProduccionRecord(result.get(i)));
                        }
                        Loader.hideLoader();
                    }
                };
                getSolicitudProduccionService().getSolicitudProduccionList(fechaInicio, fechaFin, queryCallback);
            } else {
                SC.warn("Advertencia", "La fecha de inicio no puede ser mayor que la fecha de fin", new BooleanCallback() {

                    @Override
                    public void execute(Boolean value) {
                    }
                }, new Dialog());

                return;
            }
        }
    }

    private void clearResults() {
        ListGridRecord[] records = resultsGrid.getRecords();
        if (records.length > 0) {
            for (int i = 0; i < records.length; i++) {
                resultsGrid.removeData(records[i]);
            }
        }
    }

    private SolicitudProduccionServiceAsync getSolicitudProduccionService() {
        return GWT.create(SolicitudProduccionService.class);
    }
}
